﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.IO;
using System.Xml;
namespace BattleCity
{
    class Mision
    {
        public String nombre;
        private Escenario escenario;
        private TanqueUser usuario;
        private Base baseOb;
        private Flota flota;
        private Cuponera cuponera;
        private TeletransportadorDeTanques tele1;
        private TeletransportadorDeTanques tele2;
        private TeletransportadorDeBonus teleBonus;
        private string pathPresentacion;
        public string pathArchivoConfiguracionDeMision;
        public VistaPresentacion Presentacion { get; set; }


        public Mision(string ArchivoConfiguracionDeMision)
        {
            Inicializar();
            pathArchivoConfiguracionDeMision = ArchivoConfiguracionDeMision;


            //Obtenemos los objetos del XML y los cargamos en el Escenario/Flota/Cuponera
            try
            {
                pathPresentacion = LectorDeArchivoDeMision.ObtenerPresentacion(ArchivoConfiguracionDeMision);
                Presentacion = new VistaPresentacion(pathPresentacion);
                Point puntoInicialUsuario = LectorDeArchivoDeMision.ObtenerPosicionInicialUsuario(ArchivoConfiguracionDeMision);
                TanqueUser.getTanqueUser().posicionInicial(puntoInicialUsuario);
            }
            catch
            {
                throw new FileLoadException();
            }
            List<Objeto> objetos = LectorDeArchivoDeMision.ObtenerObjetos(ArchivoConfiguracionDeMision);
            List<Objeto> Tanques = LectorDeArchivoDeMision.ObtenerFlota(ArchivoConfiguracionDeMision);
            List<Objeto> Bonus = LectorDeArchivoDeMision.ObtenerBonus(ArchivoConfiguracionDeMision);
            Marcador.getMarcador().Puntos = LectorDeArchivoDeMision.ObtenerPuntos(ArchivoConfiguracionDeMision);
            string archivoMision = LectorDeArchivoDeMision.ObtenerArchivoMision(ArchivoConfiguracionDeMision);
            if (archivoMision != "")
            {
                pathArchivoConfiguracionDeMision = archivoMision;
            }
            
            foreach (Objeto ob in objetos) { escenario.Objetos.Add(ob);}
            foreach (TanquePC ob in Tanques) { flota.Add(ob);}
            foreach (Bonus ob in Bonus) { cuponera.Add(ob);}
            nombre = Path.GetFileName(pathArchivoConfiguracionDeMision);
        }

        //Antes de cada mision hay que recetear todos los objetos singleton (menos el Marcador porque borrariamos los puntos
        private void Inicializar()
        {
            escenario = Escenario.getEscenario();
            usuario = TanqueUser.getTanqueUser();
            baseOb = Base.getBase();
            flota = Flota.getFlota();
            cuponera = Cuponera.getCuponera();

            //ReInicializacion
            escenario.Objetos.Clear();
            TanqueUser.Reset();
            Base.Reset();
            Flota.Reset();
            Cuponera.Reset();
            

            //Inicializacion
            escenario = Escenario.getEscenario();
            usuario = TanqueUser.getTanqueUser();
            baseOb = Base.getBase();
            flota = Flota.getFlota();
            cuponera = Cuponera.getCuponera();
            tele1 = new TeletransportadorDeTanques(new Point(470, 0));
            tele2 = new TeletransportadorDeTanques(new Point(0, 0));
            teleBonus = new TeletransportadorDeBonus(new Point(499, 499));

            escenario.Objetos.Add(baseOb);
            escenario.Objetos.Add(usuario);
            escenario.Objetos.Add(tele1);
            escenario.Objetos.Add(tele2);
            escenario.Objetos.Add(teleBonus);
        }

        //Recorre todos los objetos diciendoles que se persistan en un archivo xml
        //ademas guarda informacion a nivel juego, del tipo puntos, la mision actual.
        public void GuardarEstadoActual(string path)
        {
            XmlDocument xml = new XmlDocument();
            XmlNode Xmlmision = xml.CreateElement("Mision");
            XmlNode Xmlpresentacion = xml.CreateElement("ImagenPresentacion");
            Xmlpresentacion.InnerText = pathPresentacion;
            
            XmlNode Xmlpuntos = xml.CreateElement("Puntos");
            Xmlpuntos.InnerText = Marcador.getMarcador().Puntos.ToString();

            XmlNode XmlArchivoMision = xml.CreateElement("ArchivoMision");
            XmlArchivoMision.InnerText = pathArchivoConfiguracionDeMision;

            XmlNode Xmlobjetos = xml.CreateElement("Objetos");
            XmlNode Xmlflota = xml.CreateElement("Flota");
            XmlNode Xmlcuponera = xml.CreateElement("Bonus");
            Xmlmision.AppendChild(Xmlpresentacion);
            Xmlmision.AppendChild(Xmlpuntos);
            Xmlmision.AppendChild(XmlArchivoMision);
            Xmlmision.AppendChild(Xmlobjetos);
            Xmlmision.AppendChild(Xmlflota);
            Xmlmision.AppendChild(Xmlcuponera);
            xml.AppendChild(Xmlmision);

            foreach (Objeto o in escenario.Objetos.Items)
            {
                o.Persistir(xml, Xmlobjetos);
            }
            foreach (Objeto o in flota.tanques)
            {
                o.Persistir(xml, Xmlflota);
            }
            foreach (Objeto o in cuponera.cupones)
            {
                o.Persistir(xml, Xmlcuponera);
            }
            
            xml.Save(path);

        }
    }
}
